package Aplicacion;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;

import org.uqbar.commons.model.Entity;

import Aplicacion.Captura;
import Categorias.Categoria;
import Homes.CategoriasHome;

@SuppressWarnings("serial")
public class Vehiculo extends Entity {

	private ArrayList<Infraccion> infracciones;
	private HashSet<Categoria> categorias;
	public String patente;
	private int puntosRegistro;

	public static final int PUNTOSINICIALES = 1000;
	public static final double IMPORTEINICIAL = 0.0;
	public static final int ANIOSPERDONADA = 1;
	
	public Vehiculo(String patente){
		this.infracciones = new ArrayList<Infraccion>(); 
		this.categorias = new HashSet<Categoria>();		
		this.puntosRegistro = Vehiculo.PUNTOSINICIALES;
		this.setPatente(patente);
	}
	
	public void notificar(Captura captura){
		for (Categoria categoria: this.categorias){
			categoria.notificar(captura);
		}	
	}

	public void addInfraccion(Infraccion infraccion) {
		infraccion.chequearPerdonada(this.getLastInfraccion());
		this.infracciones.add(infraccion);
		this.puntosRegistro -= infraccion.getPuntos();
	}
	
	public double getImporteMultas() {
		double total = 0;
		for (Infraccion infraccion : this.infracciones) {
			total += infraccion.getCosto();
		}
		return total;
	}	
	
	public Date getFechaLastInfraccion() {
		Infraccion lastInfraccion = this.getLastInfraccion();
		if (lastInfraccion == null)
			return new Date(0);			
		return lastInfraccion.getFecha();
	}

	public Infraccion getLastInfraccion() {
		if (infracciones.isEmpty())
			return null;
		Infraccion lastInfraccion;		
		lastInfraccion = infracciones.get(0);
		for (Infraccion infraccion : this.infracciones){
			if (infraccion.getFecha().after(lastInfraccion.getFecha()))
				lastInfraccion = infraccion;
		}
		return lastInfraccion;
	}
	
	public void invalidarInfraccion(Infraccion infraccion) {
		infraccion.setInvalidada();
		this.puntosRegistro += infraccion.getPuntos();
	}	
	
	public void procesarDesasignacion() {
		ArrayList<Categoria> categorias = new ArrayList<Categoria>(this.getCategorias());
		for (Categoria categoria : categorias) {
			categoria.procesarDesAsignacion(this);
		}
	}
	
	public void procesarAsignacion() {
		for (Categoria categoria : CategoriasHome.getInstance().getAll()) {			
			categoria.procesarAsignacion(this);
		}
	}	

	public void validarInfraccionesVencidas() {
		/* Si las infracciones estan vencidas les cambio el estado */
		for (Infraccion infraccion : this.getInfracciones()) {
			infraccion.chequearVencimiento();			
		}
	}

	public void pagarInfracciones(ArrayList<Infraccion> infraccionesPagadas) {
		for (Infraccion infraccion : this.getInfracciones()) {					
			infraccion.chequearPago(infraccionesPagadas);
		}
	}
	
	public ArrayList<Infraccion> getInfraccionesInvalidadas() {
		ArrayList<Infraccion> infracciones = new ArrayList<Infraccion>();
		for (Infraccion infraccion : this.getInfracciones()) {
			if(infraccion.estaInvalidada()) {
				infracciones.add(infraccion);
			}					
		}
		return infracciones;
	}

	public void addCategoria(Categoria categoria) {
		this.categorias.add(categoria);
	}
	
	public void removeCategoria(Categoria categoria) {
		this.categorias.remove(categoria);
	}

	public HashSet<Categoria> getCategorias() {
		return this.categorias;
	}
	
	public ArrayList<Infraccion> getInfracciones() {
		return infracciones;
	}

	public void setInfracciones(ArrayList<Infraccion> infracciones) {
		this.infracciones = infracciones;
	}

	public void setPatente(String patente){
		this.patente = patente;
	}
	
	public String getPatente(){
		return this.patente;
	}		

	public void setPuntosRegistro(int puntos) {
		this.puntosRegistro = puntos; 
	}
	
	public int getPuntosRegistro() {
		return this.puntosRegistro; 
	}		
	
}

